{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    ">原文地址 https://blog.csdn.net/qq_32188669/article/details/95185731\n",
    "\n",
    "\n",
    "\n",
    "Python Gstreamer 入门 - 学习笔记\n",
    "==========================\n",
    "\n",
    "### 1. 基础知识学习阶段\n",
    "\n",
    "  首先需要了解 Gstreamer 是什么，有哪些基本的内容，element、pad、bin、pipeline 各是什么，其中又有哪些分类。这里推荐 Gsteamer 的官方文档进行学习，可以去 Gstreamer 官网寻找英文文档，也可以直接搜索 Gstreamer 应用开发手册寻找中文版。Gstreamer 是使用 C 语言编写的框架，网络上关于 Gstreamer 的资料也是 C 语言编写居多（这也是我想写一篇自己的 Python Gstreamer 学习历程的原因之一），不过不管是什么语言编写 Gstreamer 程序，基本的思路都是一样的，只是语句的表达方式不同而已，关于 C 语言和 Python 语言的函数对照表我后面也有提供。  \n",
    "  这里推荐一个翻译的 Gstreamer 基础教程、播放教程博客：[Gstreamer 基础教程](https://blog.csdn.net/sakulafly/article/category/1819383/2?)  \n",
    "常用知识总结：[gstreamer 知识总结](https://blog.csdn.net/qq_32188669/article/details/103903032)\n",
    "\n",
    "### 2. 播放功能实现思路\n",
    "\n",
    "  想要播放视频首先需要理解视频音频的编码与封装相关知识，这里推荐一个视音频编解码相关博客：[视音频编解码技术零基础学习方法](https://blog.csdn.net/leixiaohua1020/article/details/18893769#commentBox)  \n",
    "  一个 mkv 视频的形成过程为：视音频原始数据——> 音视频编码形成压缩数据——> 音视频封装为 MKV 等格式视频。相对应的我们播放一个视频就需要对这个过程翻转：MKV 视频——> 解封装——> 解码——> 播放。  \n",
    "图解：  \n",
    "![](https://img-blog.csdnimg.cn/2019070919564725.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMyMTg4NjY5,size_16,color_FFFFFF,t_70)\n",
    "\n",
    "### 3. 播放功能代码实现与资料\n",
    "\n",
    "  对于 Gstreamer 的安装，Ubuntu 可能会自带 1.0 版本，如果查找不到部分元件，可以搜索这些元件所属的插件包，这里提供一个元件和 Gstreamer 插件包对应的文档：[gstreamer 插件](https://max.book118.com/html/2017/0122/86117057.shtm)  \n",
    "下面根据顺序介绍一下我编写代码的过程以及部分代码：  \n",
    "  （1）使用 playbin 实现对音视频的播放  \n",
    "  playbin 是一个集成的箱柜可以直接用来播放多种音视频。\n",
    "\n",
    "  （2）播放 MP4、MKV 等格式视频  \n",
    "  在了解了播放视频的流程之后，播放视频最重要的一个环节是对解封装和解码元件的选择。这些我在这一个博客中有较为详细的讲解：[使用 python Gstreamer 编写 mp4 视频播放器](https://blog.csdn.net/qq_32188669/article/details/93491832)\n",
    "\n",
    "  （3）播放未知编码格式的视频  \n",
    "  使用 decodebin 来实现对未知格式视频的播放。decodebin 是一个集成的箱柜，具有解封装、分流、解码的功能。不过 decodebin 的衬垫也是随机衬垫，需要使用回调函数来实现对 pad 的连接。  \n",
    "  这里我写了两个相关的博客，第一个博客完成了对一个未知音频编码格式的 MKV 文件的播放，但是对 decodebin 的理解和使用有一部分问题，地址如下：[python Gstreamer 播放不同编码格式的视频文件](https://blog.csdn.net/qq_32188669/article/details/94021810)  \n",
    "  第二个博客改进了对 decodebin 的使用，并且学习了使用 Gstreamer 中的衬垫探测机制和阻塞来完成播放未知是否含有 Audio 的视频。博客地址：[使用 Gstreamer 播放未知格式视频 (python)](https://blog.csdn.net/qq_32188669/article/details/94551835)。目前第二个程序还存在一个问题：视频开始播放后的短暂的时间内可能会出现没有声音的现象，我有空会尝试解决，也希望大家学习之后可以给我适当的建议。  \n",
    "  对 Gstreamer 中衬垫探测机制和阻塞的使用参考了一个国外老哥的博客：[pipeline 动态连接](https://coaxion.net/blog/2014/01/gstreamer-dynamic-pipelines/)  \n",
    "  Gstreamer C 语言和 Python 语言的函数对照表：[C 语言和 Python 语言的函数对照表](https://lazka.github.io/pgi-docs/Gst-1.0/mapping.html)\n",
    "\n",
    "  （4）播放根据 rtsp 协议编码视频（不包含音频）  \n",
    "  RTSP（Real Time Streaming Protocol），RFC2326，实时流传输协议，是 TCP/IP 协议体系中的一个应用层协议。关于播放 rtsp 协议编码的视频我在这个博客下有比较详细的介绍：[Python Gstreamer 播放 rtsp 视频流（海康 IPCAM）](https://blog.csdn.net/qq_32188669/article/details/95098823)\n",
    "\n",
    "  （5）播放根据 rtsp 协议编码包含音频的视频  \n",
    "  代码详见此博客：[Python Gstreamer 播放 rtsp 视频（含音频）（海康 IPCAM）](https://blog.csdn.net/qq_32188669/article/details/95226386)\n",
    "\n",
    "  （6）将 rtsp 码流视频保存到本地  \n",
    "  思路与代码详见博客：[rtsp 码流视频保存到本地](https://blog.csdn.net/qq_32188669/article/details/96313635)\n",
    "\n",
    "  （7）python Gstreamer 将视频逐帧保存为图片  \n",
    "  同样可以理解为将视频截图，思路见博客：[python Gstreamer 将视频逐帧保存为图片](https://blog.csdn.net/qq_32188669/article/details/98472942)\n",
    "  \n",
    "  (8)[GStreamer资料(摄像头采集,视频保存,远程监控)DVR](https://www.cnblogs.com/subo_peng/p/4675384.html)\n",
    "\n",
    "### 4.gstreamer 插件\n",
    "\n",
    "- 插件的制作：[gstreamer 插件制作（插件内使用 c++ 和 opencv）](https://blog.csdn.net/qq_32188669/article/details/103043325)  \n",
    "- 插件知识总结：[gstreamer 插件知识总结](https://blog.csdn.net/qq_32188669/article/details/103904081)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- [GStreamer播放教程08——视频解码的硬件加速](https://blog.csdn.net/sakulafly/article/details/23128865)\n",
    "- [GStreamer (简体中文)](https://wiki.archlinux.org/index.php/GStreamer_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)#%E7%A1%AC%E4%BB%B6%E5%8A%A0%E9%80%9F)\n",
    "- [VAAPI](https://wiki.freedesktop.org/www/Software/vaapi/)\n",
    "\n",
    "- [FA](http://gstreamer-devel.966125.n4.nabble.com/)\n",
    "- [官方文档](https://gstreamer.freedesktop.org/documentation/installing/on-linux.html?gi-language=python)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
